#include "MenuTest.h"

MenuTest::MenuTest() {


}

MenuTest::~MenuTest() {

}

void MenuTest::ejecutarPrograma() {

	this->imprimirOpciones();
}

void MenuTest::imprimirOpciones() {

	cout << endl << endl;
	cout << "********************************************************" << endl;
	cout << "********************************************************" << endl;
	cout << "*******************      MENU TEST 2    ****************" << endl;
	cout << endl << endl;
	cout << "opciones:" << endl;
	cout << " 1 - Test oficial " << endl;
	cout << " 2 - Test clases utilitarias" << endl;
	cout << " 3 - Test Archivos con registros fijos" << endl;
	cout << " 4 - Test Archivos con registros variables" << endl;
	cout << " 5 - Test Indice Secuencial " << endl;
	cout << " 6 - Test hashing" << endl;
	cout << " 7 - Test Arbol b#" << endl;
	cout << " 8 - Test Compresion " << endl;
	cout << " 9 - Aclaracion Segunda Parte" << endl;
	cout << " 10 - salir de la aplicacion" << endl;
	cout << " opcion: ";

	this->ingresarOpcion();
	this->ejecutarTest();
}


void MenuTest::ejecutarTest() {

	switch(this->opcion) {

	case 1: {
		this->testOficial();
		this->imprimirOpciones();
		break;
	}

	case 2: {
		this->testClasesUtilitarias();
		this->imprimirOpciones();
		break;
	}

	case 3: {

		this->testArchivosConRegistrosFijos();
		this->imprimirOpciones();
		break;
	}

	case 4: {

		this->testArchivosConRegistrosVariables();
		this->imprimirOpciones();
		break;
	}

	case 5: {

		this->testIndiceSecuencial();
		this->imprimirOpciones();
		break;
	}

	case 6: {

		this->testHashing();
		this->imprimirOpciones();
		break;
	}

	case 7: {
		this->testArbol();
		this->imprimirOpciones();
		break;
	}

	case 8: {
		this->testCompresion();
		this->imprimirOpciones();
		break;
	}

	case 9: {
		this->aclaracionSegundaParte();
		this->imprimirOpciones();
	}
	case 10: {
		cout << endl << endl;
		cout << "Programa finalizado." << endl;
		break;
	}

	default :{
		cerr << "Error: opcion invalida" << endl;

		this->ingresarOpcion();
		this->ejecutarTest();
	}

	}
}

void MenuTest::testCompresion() {

	cout << endl << endl;
	cout << "Descripcion: test del compresor aritmetico y del Contenedor Comprimido." << endl;

	this->presioneUnaTeclaParaContinuar();
	cin.get();

	CppTester tester;

	tester.agregarTest(new TestCompresor(),"Test Compresor");
	//tester.agregarTest(new TestContenedorComprimido(),"Test Contenedor Compimido");

	tester.correrTests();

	cout << endl << endl;
	cout << "Test Finalizado" << endl;

	this->presioneUnaTeclaParaContinuar();

}

void MenuTest::testClasesUtilitarias() {

	cout << endl << endl;
	cout << "Descripcion: test de clases utilitarias utilizadas en el trabajo practico "<< endl;
	cout << "Se testea la clase Archivo, la Persistencia, el manejo de Bytes y de bytes con " << endl <<
			"archivos. Tambien el testeo de un recurso con claves y el manejo de buffer. " << endl;

	this->presioneUnaTeclaParaContinuar();
	cin.get();

	CppTester tester;

    tester.agregarTest(new TestBuffer(),"Test Buffer");
	tester.agregarTest(new TestClaveSimple(),"Test Clave Simple");
	tester.agregarTest(new TestArchivo(), "TestArchivo");
	tester.agregarTest(new TestPersistencia(),"Test Persistencia.");
	tester.agregarTest(new TestBytes(),"Test Bytes");
	tester.agregarTest(new TestBytesYArchivos, "Test Bytes y Archivos");
	tester.correrTests();

	cout << endl << endl;
	cout << "Test Finalizado" << endl;

	this->presioneUnaTeclaParaContinuar();
}

void MenuTest::ingresarOpcion() {

	cin >> this->opcion;
}


void MenuTest::testOficial() {

	CppTester tester;

	cout << endl << endl;
	cout << "Descripcion: Test propuesto por la catedra." << endl;

	this->presioneUnaTeclaParaContinuar();
	cin.get();

	mainOficial();

	cout << endl << endl;
	cout << "Test Finalizado" << endl;

	this->presioneUnaTeclaParaContinuar();
}

void MenuTest::presioneUnaTeclaParaContinuar() {
	cout << endl;
	cout << "Ingrese una tecla para continuar..." << endl;

	cin.clear();
	cin.get();
}

void MenuTest::testArchivosConRegistrosFijos() {

	CppTester tester;

	cout << endl << endl;
	cout << "Descripcion: Test de almacenamiento de registros fijos y recurso directo. " << endl;

	this->presioneUnaTeclaParaContinuar();
	cin.get();

    tester.agregarTest(new TestMiRegistroFijo(), "Test Basico Registros Fijos");
    tester.agregarTest(new TestRegistrosFijos(),"Test Registros Fijos");
    tester.agregarTest(new TestRecursoDirecto(), "Test Recurso Acceso Directo");
    tester.agregarTest(new TestAlmacenamientoFijoMasivo(),"Test Almacenamiento Masivo");

    tester.correrTests();

	cout << endl << endl;
	cout << "Test Finalizado" << endl;

	this->presioneUnaTeclaParaContinuar();
}

void MenuTest::testArchivosConRegistrosVariables() {

	CppTester tester;

	cout << endl << endl;
	cout << "Descripcion: Test de almacenamiento de registros de longitud variable" << endl;

	this->presioneUnaTeclaParaContinuar();
	cin.get();

	tester.agregarTest(new TestBloques(), "Test Bloques");
	tester.agregarTest(new TestRecursoAlmacenamiento, "Test Guardar");
	tester.agregarTest(new TestAlmacenamientoMasivoVariables(),"Test Almacenamiento Masivo");

	tester.correrTests();

	cout << endl << endl;
	cout << "Test Finalizado" << endl;

	this->presioneUnaTeclaParaContinuar();
}

void MenuTest::testIndiceSecuencial() {

	cout << endl << endl;
	cout << "Descripcion: Test de recurso indexado con un indice secuencial" << endl;
	cout << "la principal funcion de la implementacion del indice secuencial fue" << endl;
	cout << "probar todo el toolkit con un indice simple y rapido de implementar" << endl
	<< "y no tener que esperar a que esten los indices complejos listos" << endl;

	this->presioneUnaTeclaParaContinuar();
	cin.get();

	CppTester tester;

	tester.agregarTest(new TestIndiceSecuencial(), "Test Indice Secuencial");

	tester.correrTests();
}

void MenuTest::testHashing() {

	CppTester tester;

	cout << endl << endl;

	cout << "Descripcion: Test de almacenamiento indexado por hashing" << endl;
	cout << "podra observar un arbol que grafica el directorio y el contenido de"
		 <<	"cada bucket" << endl;

	this->presioneUnaTeclaParaContinuar();
		cin.get();

	tester.agregarTest(new TestHashing(), "Test Funciones Hash");

	tester.correrTests();
}

void MenuTest::testArbol() {

	CppTester tester;

	cout << endl << endl;

	cout << "Descripcion: Test de almacenamiento indexado por arbol b# "<< endl;
	cout << "Se indexan 300 terminos, se borran y se imprime el estado del arbol "
		 <<	"en cada paso. Al final se recorren las claves secuencialmente."<<endl;

	this->presioneUnaTeclaParaContinuar();
	cin.get();

	tester.agregarTest(new TestNewArbol(), "Test Arbol");
	tester.agregarTest(new TestTerminos(), "Test Terminos");
	tester.correrTests();
}

void MenuTest::aclaracionSegundaParte() {

	cout << endl << endl;
	cout << "Para esta segunda entrega se adaptaron los test de la primer entrega" << endl;
	cout << "configurandolos para que testeen la Estrategia Diferida y el Compuesto" << endl
		<< "Comprimido." << endl;

	this->presioneUnaTeclaParaContinuar();
	cin.get();
}
